<?php
	//***************************【文件、文件夹处理函数】***********************************
	
	//遍历文件函数
	function list_dir($path,$scan_obj=true,$sort=0,$suffix=''){				
		$list = scandir($path,$sort); 					// 得到该文件下的所有文件和文件夹(0为升序，1为降序)
		$filelist=array();
		foreach($list as $file){										//遍历
			$fil_location=$path."/".$file;
			if(is_dir($fil_location)==$scan_obj && $file!="." && $file!=".."){	//true为扫描文件夹，false为扫描文件
				if($suffix!=''){						//筛选后缀文件 多个后缀筛选 gif|jpeg|jpg|png|bmp
					$reg='/\.('.$suffix.')$/i';
					if(preg_match($reg,$file)){
						$filelist[]=$file;
					}
				}else{
					$filelist[]=$file;
				}
			}
		}
		return $filelist;
	}
	
	//索引文件夹（深层）
	function index_dir($root,$scan_obj=true){
		$no_seek=array();												//未索引的文件夹
		$dir_arr=array();												//存放文件数组
		$seek=true;														//查找开关， false 表示查找完毕
		$ls_dir="";														//临时目录
		$no_seek=list_dir($root);			
		$dir_arr=$no_seek;
		if(count($no_seek)<=0&$scan_obj==false){
			return list_dir($root,false);
		}else{
			while($seek){												//循环索引所有文件
				foreach($no_seek as $key=>$n){
					$result=list_dir($root."/".$n);
					foreach($result as $r){
						$dir_arr[]=$n."/".$r;
						$no_seek[]=$n."/".$r;
					}
					unset($no_seek[$key]);
				}
				
				if(count($no_seek)<=0) $seek=false;
			}
			sort($dir_arr,SORT_REGULAR);
			
			if($scan_obj==true){										//判断要获取的是文件夹还是文件名
				return $dir_arr;
			}else{
				$file_arr=array();										//循环索引所有的文件
				foreach($dir_arr as $d){
					$result=list_dir($root."/".$d,false);
					foreach($result as $F){
						$file_arr[]=$d."/".$F;
					}
				}
				sort($dir_arr,SORT_REGULAR);
				return $file_arr;
			}
		}
		/*原理：把所有未索引过的文件夹存放在数组中，索引过的就从数组中删除，直至数组为空
				利用所有的文件夹路径获取该目录下的文件夹，从而达到深度索引效果
		*/
	}
	
	//批量删除图片函数
	function batch_delete_img($path,$img){
		$result=true;
		foreach($img as $val){
			if(!@unlink($path.$val)){
				$result=false;
			}
		}
		return $result;
	}
	
	// 图片管理-抓取远程图片
	function save_web_images($url,$path="webimg"){
		$state = @file_get_contents($url,0,null,0,1);//获取网络资源的字符内容
		if($state){
			$suffix = getfilesuffix($url);
			if($suffix!="jpg" && $suffix!="gif" && $suffix!="png" && $suffix!="bmp"){
				return ['code'=>201,'msg'=>'抓取的目标不是图片格式'];
			}
			$mime= "image/".$suffix;
			
			//打开输出缓冲区并获取远程图片
			ob_start();
			$context = stream_context_create(
				array (
					'http' => array (
						'follow_location' => false // don't follow redirects
					)
				)
			);
			//请确保php.ini中的fopen wrappers已经激活
			readfile( $url,false,$context);
			$img = ob_get_contents();
			ob_end_clean();
			
			//大小验证
			$fileSize = strlen( $img ); //得到图片大小
			$allowSize = 5;
			if($fileSize > ($allowSize*1024*1024)){
				return ['code'=>201,'msg'=>'抓取目标图片不能超过'.$allowSize.'M'];
			}
			
			$imgDir= 'upload'.'/'. $path.'/'.date("Ymd");
			// 不存在则生成文件夹
			if(!is_dir($imgDir)){
				@mkdir($imgDir,0777,true);
			}
			$savePath = public_path() . $imgDir;
			//写入文件
			$file_name = md5(rand( 10000 , 99999 ).time()).'.'.$suffix;
			
			$tmpName = $savePath .'/' . $file_name;
		
			//创建保存位置
			if ( !file_exists( $savePath ) ) {
				mkdir( "$savePath" , 0777 , true);
			}

			try {
				$fp2 = @fopen( $tmpName , "a" );
				fwrite( $fp2 , $img );
				fclose( $fp2 );
			} catch ( Exception $e ) {
				return ['code'=>201,'msg'=>'异常错误'.$e];
			}
			return ['code'=>200,'name'=>$file_name,'href'=>'/'.$imgDir.'/'.$file_name,'ext'=>$suffix,'mime'=>$mime,'size'=>$fileSize];
		}else{
			return ['code'=>201,'msg'=>'抓取图片不存在'];
		}
	}
	
	// 自定义保存-抓取远程图片
	function save_web_images2($url,$imgDir,$file_name,$cover=false){
		$state = file_get_contents($url,0,null,0,1);//获取网络资源的字符内容
		if($state){			
			//打开输出缓冲区并获取远程图片
			ob_start();
			$context = stream_context_create(
				array (
					'http' => array (
						'follow_location' => false // don't follow redirects
					)
				)
			);
			//请确保php.ini中的fopen wrappers已经激活
			readfile( $url,false,$context);
			$img = ob_get_contents();
			ob_end_clean();
			
			//大小验证
			$fileSize = strlen( $img ); //得到图片大小
			$allowSize = 10;
			if($fileSize > ($allowSize*1024*1024)){
				return ['code'=>201,'msg'=>'抓取目标图片不能超过'.$allowSize.'M'];
			}
		
			//创建保存位置
			if ( !file_exists( $imgDir ) ) {
				mkdir( "$imgDir" , 0777 , true);
			}
	
			$tmpName = $imgDir . '/' . $file_name;
			
			if(file_exists($tmpName)){
				if($cover){
					$code=203;
					$msg="图片存在,已覆盖新图";
				}else{
					return ['code'=>202,'msg'=>'图片存在'];
				}
			}else{
				$code=200;
				$msg="【已下载图片】";
			}
			
			try {
				$fp2 = @fopen( $tmpName , "a" );
				fwrite( $fp2 , $img );
				fclose( $fp2 );
			} catch ( Exception $e ) {
				return ['code'=>201,'msg'=>'异常错误'.$e];
			}
			
			return ['code'=>$code,'name'=>$file_name,'msg'=>$msg,'size'=>$fileSize];
		}else{
			return ['code'=>201,'msg'=>'抓取图片不存在'];
		}
	}
	
	/*
		获取二进制文件真实后缀
	*/
	function getfilesuffix($name) {
		$file = fopen($name, "rb");
		$bin = fread($file,2); // 只读2字节
		fclose($file);
		$info = @unpack("C2chars", $bin);
		$code = intval($info['chars1'] . $info['chars2']);
		$suffix = "unknow";
		if($code == 255216){
			$suffix = "jpg";
		}elseif($code == 7173){
			$suffix = "gif";
		}elseif($code == 13780){
			$suffix = "png";
		}elseif($code == 6677){
			$suffix = "bmp";
		}elseif($code == 7798){
			$suffix = "exe";
		}elseif($code == 7784){
			$suffix = "midi";
		}elseif($code == 8297){
			$suffix = "rar";
		}elseif($code == 7368){
			$suffix = "mp3";
		}elseif($code == 0){
			$suffix = "mp4";
		}elseif($code == 8273){
			$suffix = "wav";
		}
		return $suffix;
	}
	
	//删除文件夹
	function delet_dir($dir) {
		//先删除目录下的文件：
		$dh=opendir($dir);
		while ($file=readdir($dh)) {
		  if($file!="." && $file!="..") {
			$full_path=$dir."/".$file;
			if(!is_dir($full_path)) {
				@unlink($full_path);
			} else {
				delet_dir($full_path);
			}
		  }
		}
		
		closedir($dh);
		//删除当前文件夹
		
		if(rmdir($dir)) {
		  return true;
		} else {
		  return false;
		}
	}
	
	//图片空间排序子函数
	function cmp_func($a, $b) {
		global $order;
		if ($a['is_dir'] && !$b['is_dir']) {
			return -1;
		} else if (!$a['is_dir'] && $b['is_dir']) {
			return 1;
		} else {
			if ($order == 'size') {
				if ($a['filesize'] > $b['filesize']) {
					return 1;
				} else if ($a['filesize'] < $b['filesize']) {
					return -1;
				} else {
					return 0;
				}
			} else if ($order == 'type') {
				return strcmp($a['filetype'], $b['filetype']);
			} else {
				return strcmp($a['filename'], $b['filename']);
			}
		}
	}
	
	/* 图片转化为二进制数据流 */
	function image_binary_decode($img_file) {
	    $p_size = filesize($img_file);
	    $img_binary = fread(fopen($img_file, "r"), $p_size);
	    return $img_binary;
	}

	/* 二进制数据流存储为图片 */
	function image_binary_encode($img_file,$data){
		return file_put_contents($img_file, $data);
	}
?>